前一段时间,看到一篇系列文章《从零开始,DIY一个jQuery 1-3》三篇文章从头讲解如何DIY一个jQuery,感觉挺有意思,今天想试一试看看。
我在前端已经有了一年的经验,jquery几乎是每天都会使用到,但是现在还没时间去研究一下它的源码,即使这样我也想动手尝试下DIY一个JQuery库,我相信这可以加深我对jquery的理解,当然我也试着去学习jquery的源码,这很可能会写成一个系列的文章,这个系列文章以一个入门的jquery原理探索者的视角。当然,这篇文章作为入门的入门。
【注】所有代码挂在我的github上
1.实现一个基本的框架
1.1 整体
- 整体是个闭包,独立作用域,避免污染全局变量
- 不用new,是因为使用了工厂模式,new放在了内部
return new jQuery.fn.init(selector)
- jQuery是最基础的对象,方法放在了
jQuery.prototype
中,即是jQuery.fn
- $.extend / $.fn.extend 来扩展静态方法和原型方法
- 使用全局变量
window.$
,window.jQuery
即可调用 return this
为了链式调用
1 | //IIFE 独立作用域 |
测试1
2
3
4
5var $div = $('div');
console.log($div);
$div.setBackground('blue');
console.log($div.jquery); //0.0.1
console.log($.fn.jquery); //0.0.1
$div的结果
1 | - j…y.fn.init {0: div, length: 1} |
1.2 冲突处理
1 | /*冲突处理*/ |
测试1
2var $$$ = jQuery.noConflict();
$$$('div').setBackground('red');
1.3 $.extend
/ $.fn.extend
来扩展静态方法和原型方法
1 | jQuery.extend = jQuery.fn.extend = function() { |
但是调用必须是$().min
而不能是$.min
1
2
3
4
5
6
7
8
9jQuery.extend({
min: function(a, b) {
return a < b ? a : b;
},
max: function(a, b) {
return a > b ? a : b;
}
});
console.log($().min(3,5));
当然这只是个人的一些想法,我们来仿照jquery源码实现
1 | var isObject = function(obj) { |
拷贝主要分为两个部分:
1 | //1-深拷贝,且确保被拷属性为对象/数组 |
使用的几种情况
1 | $.extend( targetObj, copyObj1[, copyObj2...] ) |
测试
1 | jQuery.extend({ |
注意:这个时候只是使用isObject
,isArray
并不严谨
在某些浏览器中,像 document 在 Object.toSting 调用时也会返回和 Object 相同结果;
这些我们将在《一步一步DIY一个自己jQuery库2》中进行补充。
2.全部代码
1 | //IIFE 独立作用域 |
参考阅读: